Amazon IVSをAWS CLIで操作してみた
はじめに
清水です。先日発表されたAWSのフルマネージドなライブストリーミングソリューションであるAmazon Interactive Video Service (Amazon IVS)をAWS CLIで操作しChannelなどリソース作成、ライブ配信中のステータス確認、そしてChannelの削除まで行なってみたのでまとめてみます。
なおAWS CLIの環境はv2の現時点での最新版を使用しました。具体的には以下の環境となります。
% aws --version aws-cli/2.0.36 Python/3.7.4 Darwin/19.6.0 exe/x86_64
IVS用のコマンドはaws ivs
ではじまるものとして準備されています。
現時点では以下の18個のコマンドから構成されています。
- batch-get-channel
- batch-get-stream-key
- create-channel
- create-stream-key
- delete-channel
- delete-stream-key
- get-channel
- get-stream
- get-stream-key
- list-channels
- list-stream-keys
- list-streams
- list-tags-for-resource
- put-metadata
- stop-stream
- tag-resource
- untag-resource
- update-channel
本エントリではすべてのコマンドは扱いませんが、IVSのリソースとなるChannelを作成、ライブ配信中のステータス確認、Channel削除までをAWS CLIで操作してみたいと思います。
Channelの作成
まずChannelの作成はaws ivs create-channel
コマンドで行います。
% aws ivs create-channel --name <value>
以下、実行例です。Channelリソースの名称としてcli-test-channel
を引数に渡しました。
% aws ivs create-channel --name "cli-test-channel" --region us-west-2 { "channel": { "arn": "arn:aws:ivs:us-west-2:123456789012:channel/XvXXXXXXXXIQ", "name": "cli-test-channel", "latencyMode": "LOW", "type": "STANDARD", "ingestEndpoint": "28XXXXXXXXdb.global-contribute.live-video.net", "playbackUrl": "https://28XXXXXXXXdb.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.XvXXXXXXXXIQ.m3u8", "tags": {} }, "streamKey": { "arn": "arn:aws:ivs:us-west-2:123456789012:stream-key/ZqXXXXXXXXpr", "value": "sk_us-west-2_ZqXXXXXXXXpr_VjXXXXXXXXXXXXXXXXXXXXXXXXXXw1", "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/XvXXXXXXXXIQ", "tags": {} } }
ちなみに、引数なしで実行できるかな?(いや、エラー出るよなぁ)と実行してみたら、エラーも発生せずChannelリソースが作成できました。name
は空欄となっているようです。
% aws ivs create-channel --region us-west-2 { "channel": { "arn": "arn:aws:ivs:us-west-2:123456789012:channel/U5XXXXXXXXBZ", "name": "", "latencyMode": "LOW", "type": "STANDARD", "ingestEndpoint": "28XXXXXXXXdb.global-contribute.live-video.net", "playbackUrl": "https://28XXXXXXXXdb.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.U5XXXXXXXXBZ.m3u8", "tags": {} }, "streamKey": { "arn": "arn:aws:ivs:us-west-2:123456789012:stream-key/JiXXXXXXXXZT", "value": "sk_us-west-2_JiXXXXXXXXZT_8wXXXXXXXXXXXXXXXXXXXXXXXXXXUx", "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/U5XXXXXXXXBZ", "tags": {} } }
Channelの一覧表示
Channelの一覧表示がaws ivs list-channels
コマンドで行えます。
% aws ivs list-channels
以下が実行結果です。Channelは3つある状態です。(2つがaws ivs create-channel
で作成したもの、1つは先のエントリでマネジメントコンソールから作成したものとなります。)
% aws ivs list-channels --region us-west-2 { "channels": [ { "arn": "arn:aws:ivs:us-west-2:123456789012:channel/U5XXXXXXXXBZ", "name": "", "latencyMode": "LOW", "tags": {} }, { "arn": "arn:aws:ivs:us-west-2:123456789012:channel/PuXXXXXXXXPi", "name": "ZoomLiveStreamingIVSChannel", "latencyMode": "LOW", "tags": {} }, { "arn": "arn:aws:ivs:us-west-2:123456789012:channel/XvXXXXXXXXIQ", "name": "cli-test-channel", "latencyMode": "LOW", "tags": {} } ] }
Channel情報の個別表示
続いてChannel情報の個別表示です、aws ivs get-channel
コマンドで実行します。
% aws ivs get-channel --arn <value>
引数としてはChannelのARNが必要です。Channel作成時のレスポンスやlist-channels
コマンドの実行結果からARNを取得しましょう。今回はシェル内で変数CHANNEL_ARN
に格納しておきます。
% CHANNEL_ARN="arn:aws:ivs:us-west-2:123456789012:channel/XvXXXXXXXXIQ" % echo ${CHANNEL_ARN} arn:aws:ivs:us-west-2:123456789012:channel/XvXXXXXXXXIQ
以下が実行結果です。一覧表示のlist-channels
コマンドよりも詳細な情報が取得できていることがわかります。
% aws ivs get-channel --arn ${CHANNEL_ARN} --region us-west-2 { "channel": { "arn": "arn:aws:ivs:us-west-2:123456789012:channel/XvXXXXXXXXIQ", "name": "cli-test-channel", "latencyMode": "LOW", "type": "STANDARD", "ingestEndpoint": "28XXXXXXXXdb.global-contribute.live-video.net", "playbackUrl": "https://28XXXXXXXXdb.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.XvXXXXXXXXIQ.m3u8", "tags": {} } }
この情報から、配信エンコーダに設定する情報のうちインジェスト用のEndpoint、また動画プレイヤーに設定するPlayback URLを得ることができます。以下のようにシェル変数に格納しておきました。
% INGEST_ENDPOINT=$(aws ivs get-channel --arn ${CHANNEL_ARN} --region us-west-2 --query channel.ingestEndpoint --output text) % echo ${INGEST_ENDPOINT} 28XXXXXXXXdb.global-contribute.live-video.net % INGEST_SERVER="rtmps://"${INGEST_ENDPOINT}"/app/" % echo ${INGEST_SERVER} rtmps://28XXXXXXXXdb.global-contribute.live-video.net/app/
% PLAYBACK_URL=$(aws ivs get-channel --arn ${CHANNEL_ARN} --region us-west-2 --query channel.playbackUrl --output text) % echo ${PLAYBACK_URL} https://28XXXXXXXXdb.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.XvXXXXXXXXIQ.m3u8
ストリームキー情報の表示
配信エンコーダに設定が必要なストリームキー情報はaws ivs list-stream-keys
とaws ivs get-stream-key
コマンドで取得します。
- list-stream-keys — AWS CLI 2.0.36 Command Reference
- get-stream-key — AWS CLI 2.0.36 Command Reference
aws ivs list-stream-keys
コマンドでは、ChannelのARNを引数にとります。
% aws ivs list-stream-keys --channel-arn <value>
aws ivs get-stream-key
コマンドではStream KeyのARNを引数にとります。
% aws ivs get-stream-key --arn <value>
実際の例で確認してみましょう。まずはaws ivs list-stream-keys
の実行です。ここではCahnnelのARNを引数に渡します。
% aws ivs list-stream-keys --channel-arn ${CHANNEL_ARN} --region us-west-2 { "streamKeys": [ { "arn": "arn:aws:ivs:us-west-2:123456789012:stream-key/ZqXXXXXXXXpr", "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/XvXXXXXXXXIQ", "tags": {} } ] }
streamKeys[0].arn
でStream KeyのARNを得ることができます。これもシェルの変数に格納しておきます。
% STREAMKEY_ARN=$(aws ivs list-stream-keys --channel-arn ${CHANNEL_ARN} --query 'streamKeys[0].arn' --region us-west-2 --output text) % echo ${STREAMKEY_ARN} arn:aws:ivs:us-west-2:123456789012:stream-key/ZqXXXXXXXXpr
続いてaws ivs get-stream-key
コマンドをStream KeyのARNを引数に実行します。
% aws ivs get-stream-key --arn ${STREAMKEY_ARN} --region us-west-2 { "streamKey": { "arn": "arn:aws:ivs:us-west-2:123456789012:stream-key/ZqXXXXXXXXpr", "value": "sk_us-west-2_ZqXXXXXXXXpr_VjXXXXXXXXXXXXXXXXXXXXXXXXXXw1", "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/XvXXXXXXXXIQ", "tags": {} } }
このstreamKey.valueが配信エンコーダに設定するストリームキーになります。以下でシェル変数に格納しておきます。
% STREAM_KEY=$(aws ivs get-stream-key --arn ${STREAMKEY_ARN} --query streamKey.value --region us-west-2 --output text) % echo ${STREAM_KEY} sk_us-west-2_ZqXXXXXXXXpr_VjXXXXXXXXXXXXXXXXXXXXXXXXXXw1
配信ステータスの確認
Channelを作成し、また配信に必要な情報がAWS CLIで収集できました。
確認しておくと、配信エンコーダに設定するIngest ServerとStream keyはシェル変数INGEST_SERVER
とSTREAM_KEY
に格納されています。
% echo ${INGEST_SERVER} rtmps://28XXXXXXXXdb.global-contribute.live-video.net/app/ % echo ${STREAM_KEY} sk_us-west-2_ZqXXXXXXXXpr_VjXXXXXXXXXXXXXXXXXXXXXXXXXXw1
再生プレイヤーに設定するPlayback URLはシェル変数PLAYBACK_URL
に格納されています。
% echo ${PLAYBACK_URL} https://28XXXXXXXXdb.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.XvXXXXXXXXIQ.m3u8
この情報で、実際に配信を開始してみます。配信中のステータスはaws ivs list-streams
、aws ivs get-stream
コマンドで取得できます。
aws ivs list-streams
コマンドはARNなどの引数は必要としません。
% aws ivs list-streams
aws ivs get-stream
コマンドではChannelのARNを引数に渡す必要があります。
aws ivs get-stream --channel-arn <value>
以下、実際の実行例です。
% aws ivs list-streams --region us-west-2 { "streams": [ { "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/XvXXXXXXXXIQ", "state": "LIVE", "health": "HEALTHY", "viewerCount": 2, "startTime": "2020-07-31T14:29:54+00:00" } ] }
aws ivs get-stream
コマンドではplaybackUrlまで取得が可能です。
% aws ivs get-stream --channel-arn ${CHANNEL_ARN} --region us-west-2 { "stream": { "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/XvXXXXXXXXIQ", "playbackUrl": "https://28XXXXXXXXdb.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.XvXXXXXXXXIQ.m3u8", "startTime": "2020-07-31T14:29:54+00:00", "state": "LIVE", "health": "HEALTHY", "viewerCount": 2 } }
なお、ライブ配信を停止している(配信エンコーダを停止している)状態の各コマンドの実行結果は下記のようになりました。aws ivs list-streams
は空要素で実行結果を返すのに対し、aws ivs get-stream`はエラーを返します。
% aws ivs list-streams --region us-west-2 { "streams": [] }
% aws ivs get-stream --channel-arn ${CHANNEL_ARN} --region us-west-2 An error occurred (ChannelNotBroadcasting) when calling the GetStream operation: ivs.ChannelNotBroadcasting: Channel: arn:aws:ivs:us-west-2:123456789012:channel/XvXXXXXXXXIQ is not currently online
Channelの削除
ライブ配信終了後のChannelリソース削除は、aws ivs delete-channel
で行います。
引数としてChannelのARNを渡します。なお実行時の戻り値はなしのとのことです。
% aws ivs delete-channel --arn <value>
実際に削除する前に、aws ivs list-channels
とaws ivs get-channel
コマンドで状況を確認しておきます。
% aws ivs list-channels --region us-west-2 --profile shimizu.toshiya { "channels": [ { "arn": "arn:aws:ivs:us-west-2:123456789012:channel/U5XXXXXXXXBZ", "name": "", "latencyMode": "LOW", "tags": {} }, { "arn": "arn:aws:ivs:us-west-2:123456789012:channel/PuXXXXXXXXPi", "name": "ZoomLiveStreamingIVSChannel", "latencyMode": "LOW", "tags": {} }, { "arn": "arn:aws:ivs:us-west-2:123456789012:channel/XvXXXXXXXXIQ", "name": "cli-test-channel", "latencyMode": "LOW", "tags": {} } ] }
% aws ivs get-channel --arn ${ARN} --region us-west-2 --profile shimizu.toshiya { "channel": { "arn": "arn:aws:ivs:us-west-2:123456789012:channel/XvXXXXXXXXIQ", "name": "cli-test-channel", "latencyMode": "LOW", "type": "STANDARD", "ingestEndpoint": "28XXXXXXXXdb.global-contribute.live-video.net", "playbackUrl": "https://28XXXXXXXXdb.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.XvXXXXXXXXIQ.m3u8", "tags": {} } }
削除を実行します。実行結果の出力は特にありません。
% aws ivs get-channel --arn ${ARN} --region us-west-2 --profile shimizu.toshiya
削除後に、もういちど状況を確認します。
% aws ivs list-channels --region us-west-2 --profile shimizu.toshiya { "channels": [ { "arn": "arn:aws:ivs:us-west-2:123456789012:channel/U5XXXXXXXXBZ", "name": "", "latencyMode": "LOW", "tags": {} }, { "arn": "arn:aws:ivs:us-west-2:123456789012:channel/PuXXXXXXXXPi", "name": "ZoomLiveStreamingIVSChannel", "latencyMode": "LOW", "tags": {} } ] }
% aws ivs get-channel --arn ${ARN} --region us-west-2 --profile shimizu.toshiya An error occurred (ResourceNotFoundException) when calling the GetChannel operation: ivs.ResourceNotFoundException: Resource: arn:aws:ivs:us-west-2:123456789012:channel/XvXXXXXXXXIQ not found
Channel名称cli-test-channel
については削除されていることが確認できました。aws ivs get-channel
コマンドについてはエラーとなりますね。
まとめ
Amazon Interactive Video Service (Amazon IVS)をAWS CLIで操作、Channelの作成から配信中のステータス確認、そしてChannelの削除までを行なってみました。IVSが非常にシンプルにライブ配信ができるぶん、AWS CLIでも非常にシンプルに使えるなぁという印象です。Amazon IVSのその他の細かな機能についても、AWS CLIでの実現含め追って確認していきたいと思います。